[小ネタ]CloudFormation テンプレートをPythonで記述して実行してみた
はじめに
最近はぼちぼちとCloudFormationを触り始めている、t.hondaです。CloudFormationと言えば、JSONのテンプレートです。このテンプレート、いろいろなサイト・記事でも言われていることですが、私としては以下ようなことが心に引っ掛かっていました。
- コメントが書けない
- (ベタ書きのJSONのため)重複する記述を共通化できない
- もう少しプログラムチックに書きたい
これらを解決するため、プログラムにてJSONのテンプレートを作成するようにしてみました。同時にテンプレートからStackを作成し、コマンド一発でJSONの作成・Stackの作成をするようにしてみました。
プログラムについて
では、そのプログラムについてです。使用したプログラム言語はPython2.7で、S3にバケットを作成する簡単なテンプレートを記述してみました。
1.事前準備
pyenv、virtualenv、pipはインストール済みのものとします。またクレデンシャルファイル(~/.aws/credentials等)には接続先のアクセスキー・シークレットキーを記述しておきます。
作業する場所に移動し、以下のコマンドを実行して仮想環境を構築します。
$ pyenv local 2.7.11 $ virtualenv venv $ . venv/bin/activate
Stackの作成にはboto3を使用するので、以下のコマンドでインストールしておきます。
pip install boto3
2.プログラム
プログラムは以下のようになります。
#!/usr/bin/env python # -*- coding: utf-8 -*- import json from util.cloud_formation import CloudFormation def main(): dict = { "AWSTemplateFormatVersion" : "2010-09-09", #コメント1 "Resources" : { "S3Bucket" : { "Type" : "AWS::S3::Bucket", "Properties" : { "AccessControl" : "Private", #コメント2 "BucketName" : "t-honda-cloudformation" } } } } json_str = json.dumps(dict, indent=4) print(json_str) cf = CloudFormation() cf.create_stack('python-stack', json_str) if __name__ == "__main__": main()
Pythonのプログラムなので、8・13行目のようにコメントを記述することができます。また今回は行ってはいませんが、バケット名を外出しの定義ファイルに記述することや、テンプレートの重複する部分を共通化することも可能です。
実行してみる
上記のプログラムを実行してみます。
$ python s3.py { "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "S3Bucket": { "Type": "AWS::S3::Bucket", "Properties": { "AccessControl": "Private", "BucketName": "t-honda-cloudformation" } } } }
以下のようにStackが作成され・・・
S3にバケットが作成されました。
まとめ
CloudFormationのテンプレート作成には様々なアプローチがあり、troposphereなどのツールを使うのもなどがあります。それらのうちの1つとして「プログラムでJSONを記述してしまう」というのも頭の片隅に入れておくと良いかもしれません。